
package com.hlkj.pay.app.merchant.ext.impl.lakala.handler;
/*
 * Hlpay-Plus aggregate payment system.
 * Copyright (c) 2024-2025 Hlpay Team Copyright has the right of final interpretation.
 */

import java.util.HashMap;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import com.hlkj.framework.common.pojo.CommonResult;
import com.hlkj.framework.common.util.json.JsonUtils;
import com.hlkj.framework.http.template.OkHttpTemplate;
import com.hlkj.pay.app.merchant.ext.impl.lakala.dto.LakalaConfig;
import com.hlkj.pay.app.merchant.ext.impl.lakala.dto.resp.LakalaTokenRes;
import com.hlkj.pay.common.PayResultCode;
import com.hlkj.pay.infrastructure.model.pay.ProviderChannelConfigDO;

import lombok.extern.slf4j.Slf4j;

/**
 * 汇付 商户进件参数处理
 * 
 * @author HlpayTeam
 * @date 2024/09/26 12:02
 */
@Slf4j
@Service
public class LakalaMerchantCommonParamsHandle {

    private String accessToken;

    private long tokenExpires;

    @Autowired
    private OkHttpTemplate okHttpTemplate;

    @Value("${spring.profiles.active}")
    private String active;
    public CommonResult<LakalaConfig> lakalaConfig(ProviderChannelConfigDO providerChannelConfigDO, boolean test) {
        String paramsConfig = providerChannelConfigDO.getParamsConfig();
        if (StringUtils.isEmpty(paramsConfig)) {
            return CommonResult.error(PayResultCode.PAY_CHANNEL_CONFIG_NOT_EXITS);
        }
        // 配置转换
        LakalaConfig lakalaConfig = null;
        try {
            lakalaConfig = JsonUtils.parseObject(paramsConfig, LakalaConfig.class);
            if(!active.equals("prod")){
                log.info("拉卡拉非prod 环境,更新证书信息");
                lakalaConfig.setLklCerPath(lakalaConfig.getLklCerPath().replace("/www/wwwroot/pay/uploads/secret/20241218/","E:/work/local_file/secret/20241218/"));
                lakalaConfig.setPriKeyPath(lakalaConfig.getPriKeyPath().replace("/www/wwwroot/pay/uploads/secret/20241218/","E:/work/local_file/secret/20241218/"));
                lakalaConfig.setLklNotifyCerPath(lakalaConfig.getLklNotifyCerPath().replace("/www/wwwroot/pay/uploads/secret/20241218/","E:/work/local_file/secret/20241218/"));
            }

            CommonResult<String> tokenResult = token(lakalaConfig, test);
            if (!tokenResult.isSuccess()) {
                return CommonResult.error(tokenResult.getCode(), tokenResult.getMsg());
            }
            return CommonResult.success(lakalaConfig);
        }
        catch (Exception e) {
            String format = String.format(PayResultCode.PAY_CHANNEL_CONFIG_ERROR.getMsg(), "拉卡拉");
            return CommonResult.error(PayResultCode.PAY_CHANNEL_CONFIG_NOT_EXITS.getCode(), format);
        }
    }

    Map<String, String> headerMap(LakalaConfig lakalaConfig, boolean test) {
        Map<String, String> headerMap = new HashMap<>();
        headerMap.put("Authorization", "Bearer " + token(lakalaConfig, test).getData());
        return headerMap;
    }

    public CommonResult<String> token(LakalaConfig lakalaConfig, boolean test) {
        long currentTimeMillis = System.currentTimeMillis();
        if (StringUtils.hasText(accessToken) && (tokenExpires - currentTimeMillis) > 1000) {
            log.info("当前token 有效:{}",accessToken);
            return CommonResult.success(accessToken);
        }
        log.info("拉卡拉 token 已失效 从新获取 tokenExpires:{},currentTimeMillis:{},time:{}", tokenExpires, currentTimeMillis, tokenExpires - currentTimeMillis);
        // .url("https://test.wsmsd.cn/sit/htkauth/oauth/token?grant_type=client_credentials&client_id=testsit&client_secret=EguwEckByf2I6u6z")
        StringBuilder sb = new StringBuilder(tokenUrl(test));
        sb.append("/oauth/token?grant_type=client_credentials&client_id=").append(lakalaConfig.getClientId());
        sb.append("&client_secret=").append(lakalaConfig.getClientSecret());
        try {
            String post = okHttpTemplate.post(sb.toString(), null);
            LakalaTokenRes lakalaTokenRes = JsonUtils.parseObject(post, LakalaTokenRes.class);
            if (StringUtils.isEmpty(lakalaTokenRes.getAccess_token())) {
                String format = String.format(PayResultCode.PAY_CHANNEL_CONFIG_ERROR.getMsg(), "拉卡拉");
                format = format + lakalaTokenRes.getError_description();
                return CommonResult.error(PayResultCode.PAY_CHANNEL_CONFIG_ERROR.getCode(), format);
            }
            accessToken = lakalaTokenRes.getAccess_token();
            tokenExpires = currentTimeMillis + lakalaTokenRes.getExpires_in() * 1000;
            return CommonResult.success(accessToken);
        }
        catch (Exception e) {
            log.error("获取拉卡拉token 失败:{}", e.getMessage());
            return CommonResult.error(PayResultCode.PAY_CHANNEL_CONFIG_ERROR.getCode(), e.getMessage());
        }
    }

    public static String date(String date) {
        if (!StringUtils.hasText(date)) {
            return null;
        }
        return date;
    }


    public static String licenseType(String code) {
        if (!StringUtils.hasText(code)) {
            return null;
        }
        // 营业执照类型：
        // 1：营业执照
        // 2：营业执照(多证合一)
        // 3：事业单位法人证书
        // 4：社会团体法人登记证书
        // 5：民办非企业单位登记证书
        // 6：基金会法人登记证书
        // 7：宗教活动场所登记证
        // 8：其他证书/批文/证明
        // 9：执业许可证/执业证
        // 10：基层群众性自治组织特别法人统一社会信用代码证
        // 11：农村集体经济组织登记证
        // 12：业主委员会备案证明

        // 11 营业执照
        // 12 组织机构代码证
        // 13 税务登记证
        // 14 统一社会信用代码证
        // 15 单位证明
        // 16 事业单位法人正式
        // 17 民办非企业单位登记证书
        // 18 基金会法人登记证书
        // 19 社会团体登记证书
        // 99 其它
        switch (code) {
            case "1":
            case "2":
                return "11";
            case "3":
                return "16";
            case "4":
                return "19";
            case "5":
                return "17";
            case "6":
                return "18";
            case "7":
                return "12";
            case "8":
                return "99";
            case "9":
                return "99";
            case "10":
                return "12";
            case "11":
                return "12";
            case "12":
                return "15";
            default:
                return null;
        }
    }

    public static String certType(String code) {
        if (!StringUtils.hasText(code)) {
            return null;
        }
        // 营业执照类型：
        // 1:身份证
        // 2:护照
        // 3:军官证
        // 4:士兵证
        // 5:回乡证
        // 6:户口本
        // 7:外国护照
        // 8:其他
        // 9:暂住证
        // 10:警官证
        // 11:文职干部证
        // 12:港澳台同胞通行证
        // 13:外国人居留证
        // 14:台胞证
        // 15:港澳台居住证
        // 16：营业执照 （只有部分场景才会用到 如 受益人和股东）

        // 01 身份证
        // 02 军官证
        // 03 护照
        // 04 户口簿
        // 05 士兵证
        // 06 港澳来往内地通行证
        // 07 台湾同胞来往内地通行证
        // 08 临时身份证
        // 09 外国人居留证
        // 10 警官证
        // 11 营业执照
        // 12 组织机构代码证
        // 13 税务登记证
        // 14 统一社会信用代码证
        // 15 单位证明
        // 16 事业单位法人正式
        // 17 民办非企业单位登记证书
        // 18 基金会法人登记证书
        // 19 社会团体登记证书
        // 99 其它
        switch (code) {
            case "1":
                return "01";
            case "2":
                return "03";
            case "3":
                return "02";
            case "4":
                return "05";
            case "5":
                return "99";
            case "6":
                return "04";
            case "7":
                return "03";
            case "8":
                return "99";
            case "9":
                return "99";
            case "10":
                return "10";
            case "11":
                return "99";
            case "12":
                return "06";
            case "13":
                return "09";
            case "14":
                return "07";
            case "15":
                return "99";
            case "16":
                return "11";
            default:
                return null;
        }
    }
    public static String openapiDomain(boolean test) {
        //测试环境：https://test.wsmsd.cn/sit/api/v2/mms/openApi/wechatParamConf
        // 生产环境：https://s2.lakala.com/api/v2/mms/openApi/wechatParamConf
        if (test) {
            return "https://test.wsmsd.cn/sit";
        }
        else {
            return "https://s2.lakala.com";
        }
    }
    public static String approveUrl(boolean test) {
        // 测试环境地址 https://test.wsmsd.cn/sit/htk-api/customer/update/review
        // 生产环境地址 https://htkapi.lakala.com/api/customer/update/review
        if (test) {
            return "https://test.wsmsd.cn/sit/htk-api/customer/update/review";
        }
        else {
            return "https://htkapi.lakala.com/api/customer/update/review";
        }
    }

    public static String accessUrl(boolean test) {
        // 测试环境: https://test.wsmsd.cn/sit/htkregistration/merchant (POST)
        // ⽣产环境: https://htkactvi.lakala.com/registration/merchant (POST)
        if (test) {
            return "https://test.wsmsd.cn/sit/htkregistration/merchant";
        }
        else {
            return "https://htkactvi.lakala.com/registration/merchant";
        }
    }
    public static String accessQueryUrl(boolean test) {
        // 测试公网地址 https://test.wsmsd.cn/sit/htkmerchants
        // 生产地址 https://tkapi.lakala.com/htkmerchants
        if (test) {
            return "https://test.wsmsd.cn/sit/htkmerchants/open/merchant/info";
        }
        else {
            return "https://tkapi.lakala.com/htkmerchants/open/merchant/info";
        }
    }
    public static String accessTermQueryUrl(boolean test) {
        // 测试公网地址 https://test.wsmsd.cn/sit/htkmerchants
        // 生产地址 https://tkapi.lakala.com/htkmerchants
        if (test) {
            return "https://test.wsmsd.cn/sit/htkmerchants/open/merchant/microTermList";
        }
        else {
            return "https://tkapi.lakala.com/htkmerchants/open/merchant/microTermList";
        }
    }
    public static String subMerInfoQueryUrl(boolean test) {
        // 测试公网地址 https://test.wsmsd.cn/sit/htkmerchants
        // 生产地址 https://tkapi.lakala.com/htkmerchants
        // 接口地址 open/merchant/submer
        if (test) {
            return "https://test.wsmsd.cn/sit/htkmerchants/open/merchant/submer";
        }
        else {
            return "https://tkapi.lakala.com/htkmerchants/open/merchant/submer";
        }
    }

    public static String fileUrl(boolean test) {
        // 测试环境内网：http://htkactvi-sit.lakala.sh.in/registration/api/registration
        // 测试环境外网：https://test.wsmsd.cn/sit//htkregistration
        // 生产环境：https://htkactvi.lakala.com/registration
        // 1文件上传
        // 请求方式：post
        // 请求接口 /file/upload
        if (test) {
            return "https://test.wsmsd.cn/sit//htkregistration";
        }
        else {
            return "https://htkactvi.lakala.com/registration";
        }
    }

    public static String tokenUrl(boolean test) {
        // 测试公网地址 https://test.wsmsd.cn/sit/htkauth/oauth/token
        // ⽣产地址 https://tkapi.lakala.com/auth/oauth/token
        if (test) {
            return "https://test.wsmsd.cn/sit/htkauth";
        }
        else {
            return "https://tkapi.lakala.com/auth";
        }
    }

}
